package coreutil

import (
	"reflect"
)

type arrayUtil struct {
}

// IndexOf 数组查找函数
func (p *arrayUtil) IndexOf(arr interface{}, callback func(ele interface{}, index int) bool) int {
	contentValue := reflect.ValueOf(arr)
	arrType := reflect.TypeOf(arr)
	if arrType.Kind() != reflect.Slice {
		panic("expects a slice type")
	}
	for i := 0; i < contentValue.Len(); i++ {
		if content := contentValue.Index(i); callback(content.Interface(), i) {
			return i
		}
	}
	return -1
}

// IndexOf 数组查找函数
func (p *arrayUtil) Find(arr interface{}, callback func(ele interface{}, index int) bool) interface{} {
	contentValue := reflect.ValueOf(arr)
	arrType := reflect.TypeOf(arr)
	if arrType.Kind() != reflect.Slice {
		panic("expects a slice type")
	}
	for i := 0; i < contentValue.Len(); i++ {
		if content := contentValue.Index(i); callback(content.Interface(), i) {
			return content.Interface()
		}
	}
	return nil
}

// Filter 切片元素过滤
func (p *arrayUtil) Filter(arr interface{}, callback func(ele interface{}, index int) bool) (interface{}, bool) {
	contentType := reflect.TypeOf(arr)
	contentValue := reflect.ValueOf(arr)
	newContent := reflect.MakeSlice(contentType, 0, 0)
	for i := 0; i < contentValue.Len(); i++ {
		if content := contentValue.Index(i); callback(content.Interface(), i) {
			newContent = reflect.Append(newContent, content)
		}
	}
	if newContent.Len() == 0 {
		return newContent.Interface(), false
	}
	return newContent.Interface(), true
}

// IdsNotIn 获取一个数组不在另外一个数组的 数
func (p *arrayUtil) IdsNotIn(src, dst []int64) []int64 {
	var r = make([]int64, 0)
	for i := 0; i < len(src); i++ {
		var bfound = false
		for j := 0; j < len(dst); j++ {
			bfound = src[i] == dst[j]
			if bfound {
				break
			}
		}
		if !bfound {
			r = append(r, src[i])
		}
	}
	return r
}

// IdIn 获取一个数组不在另外一个数组的 数
func (p *arrayUtil) IdIn(id int64, src []int64) bool {
	for i := 0; i < len(src); i++ {
		if src[i] == id {
			return true
		}
	}
	return false
}

var (
	ArrayUtil = &arrayUtil{}
)
